home *** CD-ROM | disk | FTP | other *** search
- /*
-
- Name:
- DRV_MAC.C
-
- Description:
- Mikmod driver for output on Macintosh sound card
- © 1996 Dmitry Boldyrev
-
- NOTE: If you use any ideas from this portion of code, please give me credit.
-
- Portability:
-
- MSDOS: n
- Win95: n
- Linux: n
- Macintosh: y
-
- (y) - yes
- (n) - no (not possible or not useful)
- (?) - may be possible, but not tested
- */
-
- #ifndef __SOUND__
- #include <Sound.h>
- #endif
-
- #include "mikmod.h"
-
- #define MACBUFFERSIZE 8192
-
- static SndChannel* gSndChannel;
- static SndDoubleBufferHeader doubleHeader;
-
- BOOL MAC_IsThere(void)
- {
- return 1;
- }
-
- static pascal void MyDoubleBackProc(SndChannelPtr chan, SndDoubleBufferPtr doubleBuffer)
- {
- long oldA5;
-
- oldA5 = SetA5 (doubleBuffer->dbUserInfo[0]);
-
- doubleBuffer->dbNumFrames = VC_WriteBytes(&doubleBuffer->dbSoundData[0], MACBUFFERSIZE) >> 2;
- doubleBuffer->dbFlags |= dbBufferReady;
-
- SetA5 (oldA5);
- }
-
- BOOL MAC_Init(void)
- {
- OSErr iErr;
- SndCommand Cmd;
-
- iErr = SndNewChannel(&gSndChannel, sampledSynth,
- ((md_mode & DMODE_STEREO) ? initStereo : initMono) | initNoInterp,
- NULL);
- if (iErr != noErr)
- {
- printf("SndNewChannel() -> %d\n", iErr);
- return 0;
- }
- Cmd.cmd = ampCmd;
- Cmd.param1 = 255;
- Cmd.param2 = 0;
- iErr = SndDoImmediate(gSndChannel, &Cmd);
- if (iErr != noErr)
- {
- printf("SndDoImmediate() -> %d\n", iErr);
- return 1;
- }
- if(!VC_Init()) {
- SndDisposeChannel(gSndChannel, TRUE);
- return 0;
- }
-
- return 1;
- }
-
- void MAC_Exit(void)
- {
- SndCommand Cmd;
- int i;
-
- VC_Exit();
-
- SndDisposeChannel(gSndChannel, TRUE);
- }
-
- void MAC_PlayStart(void)
- {
- OSErr iErr;
- int i;
- SndDoubleBufferPtr doubleBuffer;
-
- VC_PlayStart();
- doubleHeader.dbhNumChannels = (md_mode & DMODE_STEREO) ? 2 : 1; // stereo or mono?
- doubleHeader.dbhSampleSize = (md_mode & DMODE_16BITS) ? 16 : 8; // 16 bit or 8 bit sampling?
- doubleHeader.dbhCompressionID = 0;
- doubleHeader.dbhPacketSize = 0;
- doubleHeader.dbhSampleRate = md_mixfreq << 16; // Fixed sampling rate
- doubleHeader.dbhDoubleBack = NewSndDoubleBackProc(MyDoubleBackProc);
-
- for (i = 0; i <= 1; i++) {
- doubleBuffer = (SndDoubleBufferPtr) NewPtr (sizeof (SndDoubleBuffer) +
- MACBUFFERSIZE);
- if (!doubleBuffer) {
- return;
- }
-
- // Initialize the Doubler buffers
- doubleBuffer->dbNumFrames = 0;
- doubleBuffer->dbFlags = 0;
- doubleBuffer->dbUserInfo[0] = SetCurrentA5();
-
- // Feed the doublerBuffers with samples
- MyDoubleBackProc(gSndChannel, doubleBuffer);
- doubleHeader.dbhBufferPtr[i] = doubleBuffer;
- }
- iErr = SndPlayDoubleBuffer(gSndChannel, &doubleHeader);
- }
-
- void MAC_PlayStop(void)
- {
- SndCommand Cmd;
-
- VC_PlayStop();
- Cmd.cmd = quietCmd;
- Cmd.param1 = 0;
- Cmd.param2 = 0;
- SndDoImmediate(gSndChannel, &Cmd);
- }
-
- static void MAC_Update(void)
- {
- // [DEMOS]-> Interrupt driven synthesis (no updates needed)
- }
-
- DRIVER drv_mac = {
- NULL,
- "MAC driver",
- "v1.0",
- MAC_IsThere,
- VC_SampleLoad,
- VC_SampleUnload,
- MAC_Init,
- MAC_Exit,
- MAC_PlayStart,
- MAC_PlayStop,
- MAC_Update,
- VC_VoiceSetVolume,
- VC_VoiceSetFrequency,
- VC_VoiceSetPanning,
- VC_VoicePlay
- };
-